home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 10868 / 10868.xpi / modules / engines / clientData.js < prev    next >
Text File  |  2010-02-02  |  8KB  |  268 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Weave
  15.  *
  16.  * The Initial Developer of the Original Code is Mozilla.
  17.  * Portions created by the Initial Developer are Copyright (C) 2009
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *  Dan Mills <thunder@mozilla.com>
  22.  *
  23.  * Alternatively, the contents of this file may be used under the terms of
  24.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  25.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  26.  * in which case the provisions of the GPL or the LGPL are applicable instead
  27.  * of those above. If you wish to allow use of your version of this file only
  28.  * under the terms of either the GPL or the LGPL, and not to allow others to
  29.  * use your version of this file under the terms of the MPL, indicate your
  30.  * decision by deleting the provisions above and replace them with the notice
  31.  * and other provisions required by the GPL or the LGPL. If you do not delete
  32.  * the provisions above, a recipient may use your version of this file under
  33.  * the terms of any one of the MPL, the GPL or the LGPL.
  34.  *
  35.  * ***** END LICENSE BLOCK ***** */
  36.  
  37. const EXPORTED_SYMBOLS = ['Clients'];
  38.  
  39. const Cc = Components.classes;
  40. const Ci = Components.interfaces;
  41. const Cu = Components.utils;
  42.  
  43. Cu.import("resource://weave/util.js");
  44. Cu.import("resource://weave/engines.js");
  45. Cu.import("resource://weave/stores.js");
  46. Cu.import("resource://weave/trackers.js");
  47. Cu.import("resource://weave/type_records/clientData.js");
  48.  
  49. Utils.lazy(this, 'Clients', ClientEngine);
  50.  
  51. function ClientEngine() {
  52.   this._init();
  53. }
  54. ClientEngine.prototype = {
  55.   __proto__: SyncEngine.prototype,
  56.   name: "clients",
  57.   _displayName: "Clients",
  58.   description: "Sync information about other clients connected to Weave Sync",
  59.   logName: "Clients",
  60.   _storeObj: ClientStore,
  61.   _trackerObj: ClientTracker,
  62.   _recordObj: ClientRecord,
  63.  
  64.   _init: function _init() {
  65.     // Reset the client on every startup so that we fetch recent clients
  66.     SyncEngine.prototype._init.call(this);
  67.     this._resetClient();
  68.     Utils.prefs.addObserver("", this, false);
  69.   },
  70.  
  71.   // get and set info for clients
  72.  
  73.   // FIXME: callers must use the setInfo interface or changes won't get synced,
  74.   // which is unintuitive
  75.  
  76.   getClients: function ClientEngine_getClients() {
  77.     return this._store.clients;
  78.   },
  79.  
  80.   getInfo: function ClientEngine_getInfo(id) {
  81.     return this._store.getInfo(id);
  82.   },
  83.  
  84.   setInfo: function ClientEngine_setInfo(id, info) {
  85.     this._store.setInfo(id, info);
  86.     this._tracker.addChangedID(id);
  87.   },
  88.  
  89.   // helpers for getting/setting this client's info directly
  90.  
  91.   get clientID() {
  92.     if (!Svc.Prefs.get("client.GUID"))
  93.       Svc.Prefs.set("client.GUID", Utils.makeGUID());
  94.     return Svc.Prefs.get("client.GUID");
  95.   },
  96.  
  97.   get syncID() {
  98.     if (!Svc.Prefs.get("client.syncID"))
  99.       Svc.Prefs.set("client.syncID", Utils.makeGUID());
  100.     return Svc.Prefs.get("client.syncID");
  101.   },
  102.   set syncID(value) {
  103.     Svc.Prefs.set("client.syncID", value);
  104.   },
  105.   resetSyncID: function ClientEngine_resetSyncID() {
  106.     Svc.Prefs.reset("client.syncID");
  107.   },
  108.  
  109.   get clientName() {
  110.     if (Svc.Prefs.isSet("client.name"))
  111.       return Svc.Prefs.get("client.name");
  112.  
  113.     // Generate a client name if we don't have a useful one yet
  114.     let user = Svc.Env.get("USER") || Svc.Env.get("USERNAME");
  115.     let app = Svc.AppInfo.name;
  116.     let host = Svc.SysInfo.get("host");
  117.  
  118.     // Try figuring out the name of the current profile
  119.     let prof = Svc.Directory.get("ProfD", Components.interfaces.nsIFile).path;
  120.     let profiles = Svc.Profiles.profiles;
  121.     while (profiles.hasMoreElements()) {
  122.       let profile = profiles.getNext().QueryInterface(Ci.nsIToolkitProfile);
  123.       if (prof == profile.rootDir.path) {
  124.         // Only bother adding the profile name if it's not "default"
  125.         if (profile.name != "default")
  126.           host = profile.name + "-" + host;
  127.         break;
  128.       }
  129.     }
  130.  
  131.     return this.clientName = Str.sync.get("client.name", [user, app, host]);
  132.   },
  133.   set clientName(value) { Svc.Prefs.set("client.name", value); },
  134.  
  135.   get clientType() { return Svc.Prefs.get("client.type", "desktop"); },
  136.   set clientType(value) { Svc.Prefs.set("client.type", value); },
  137.  
  138.   updateLocalInfo: function ClientEngine_updateLocalInfo(info) {
  139.     // Grab data from the store if we weren't given something to start with
  140.     if (!info)
  141.       info = this.getInfo(this.clientID);
  142.  
  143.     // Overwrite any existing values with the ones from the pref
  144.     info.name = this.clientName;
  145.     info.type = this.clientType;
  146.  
  147.     return info;
  148.   },
  149.  
  150.   observe: function ClientEngine_observe(subject, topic, data) {
  151.     switch (topic) {
  152.     case "nsPref:changed":
  153.       switch (data) {
  154.       case "client.name":
  155.       case "client.type":
  156.         // Update the store and tracker on pref changes
  157.         this.setInfo(this.clientID, this.updateLocalInfo());
  158.         break;
  159.       }
  160.       break;
  161.     }
  162.   },
  163.  
  164.   // Always process incoming items because they might have commands
  165.   _reconcile: function _reconcile() {
  166.     return true;
  167.   },
  168.  
  169.   _resetClient: function ClientEngine__resetClient() {
  170.     SyncEngine.prototype._resetClient.call(this);
  171.     this._store.wipe();
  172.  
  173.     // Make sure the local client exists after wiping
  174.     this.setInfo(this.clientID, this.updateLocalInfo({}));
  175.   }
  176. };
  177.  
  178. function ClientStore() {
  179.   this.init();
  180. }
  181. ClientStore.prototype = {
  182.   //////////////////////////////////////////////////////////////////////////////
  183.   // ClientStore Attributes
  184.  
  185.   clients: {},
  186.  
  187.   __proto__: Store.prototype,
  188.  
  189.   //////////////////////////////////////////////////////////////////////////////
  190.   // ClientStore Methods
  191.  
  192.   /**
  193.    * Get the client by guid
  194.    */
  195.   getInfo: function ClientStore_getInfo(id) this.clients[id],
  196.  
  197.   /**
  198.    * Initialize parent class then load client data from disk
  199.    */
  200.   init: function ClientStore_init() {
  201.     this._init.call(this);
  202.   },
  203.  
  204.   /**
  205.    * Set the client data for a guid. Use Engine.setInfo to update tracker.
  206.    */
  207.   setInfo: function ClientStore_setInfo(id, info) {
  208.     this._log.debug("Setting client " + id + ": " + JSON.stringify(info));
  209.     this.clients[id] = info;
  210.   },
  211.  
  212.   //////////////////////////////////////////////////////////////////////////////
  213.   // Store.prototype Attributes
  214.  
  215.   name: "clients",
  216.   _logName: "Clients.Store",
  217.  
  218.   //////////////////////////////////////////////////////////////////////////////
  219.   // Store.prototype Methods
  220.  
  221.   changeItemID: function ClientStore_changeItemID(oldID, newID) {
  222.     this._log.debug("Changing id from " + oldId + " to " + newID);
  223.     this.clients[newID] = this.clients[oldID];
  224.     delete this.clients[oldID];
  225.   },
  226.  
  227.   create: function ClientStore_create(record) {
  228.     this.update(record);
  229.   },
  230.  
  231.   createRecord: function ClientStore_createRecord(id) {
  232.     let record = new ClientRecord();
  233.     record.id = id;
  234.     record.payload = this.clients[id];
  235.     return record;
  236.   },
  237.  
  238.   getAllIDs: function ClientStore_getAllIDs() this.clients,
  239.  
  240.   itemExists: function ClientStore_itemExists(id) id in this.clients,
  241.  
  242.   remove: function ClientStore_remove(record) {
  243.     this._log.debug("Removing client " + record.id);
  244.     delete this.clients[record.id];
  245.   },
  246.  
  247.   update: function ClientStore_update(record) {
  248.     this._log.debug("Updating client " + record.id);
  249.     this.clients[record.id] = record.payload;
  250.   },
  251.  
  252.   wipe: function ClientStore_wipe() {
  253.     this._log.debug("Wiping local clients store")
  254.     this.clients = {};
  255.   },
  256. };
  257.  
  258. function ClientTracker() {
  259.   this._init();
  260. }
  261. ClientTracker.prototype = {
  262.   __proto__: Tracker.prototype,
  263.   name: "clients",
  264.   _logName: "ClientTracker",
  265.   file: "clients",
  266.   get score() 100 // always sync
  267. };
  268.